package inner;

class OuterClass {
    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;
    public void test(){
        System.out.println("OuterClass:test()");
        InnerClass innerClass = new InnerClass();
        innerClass.func();
    }

    /**
     *  实例内部类
     *  1. 如何获取 实例内部类的对象
     *   OuterClass.InnerClass innerClass = outerClass.new InnerClass();
     *  2.（1）实例内部类当中 不能有静态的成员变量，非要定义，那么就只能是被static final 修饰的
     *   因为静态成员变量在类加载时就会被执行，而InnerClass实例化需要外部类对象的引用，要先有外部类对象
     *   静态成员会先于InnerClass执行，所以静态的成员变量不能在实例内部类中
     *    （2） 在static后加上final并且赋值了，就不报错可以运行了
     *   因为加上final再赋值，此代码就相当于一个常量，常量在编译时就确定了它的值
     *   final是常量的意思
     *  3. 若外部类和实例内部类有相同的成员变量，那么输出遵循就近原则
     *     那在实例内部类当中，如何访问外部类当中，相同的成员变量呢？（类.this.成员变量）
     *       在实例内部类当中,获取外部类的this  :  OuterClass.this.data1
     *
     */
    class InnerClass{
        public int data1 = 111;
        public int data4 = 4;
        int data5 = 5;
        //public static int data6;//error
        public static final int data6 = 10;
        public void func(){
            System.out.println("InnerClass:func()");
            /*OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);*/
            System.out.println(data1);//111(就近原则)
            System.out.println(OuterClass.this.data1);//1//非要输出外部类中的成员变量可以这样
            System.out.println(data2);//2
            System.out.println(data3);//3
            System.out.println(data4);//4
            System.out.println(data5);//5
            System.out.println(data6);//10
            test();
        }
    }
}
public class Test {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
       /* System.out.println(outerClass.data1);*/
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();


        OuterClass.InnerClass innerClass3 = new OuterClass().new InnerClass();
    }
}
